在昨天我們已經了解如何使用plotly畫圖,而今天的範例會搭配yfinance畫出台積電上半年的股價做一個範例。
yfinance是一個可以快速從yahoo股市爬取股價的一個套件,方法如下:
df = yf.download("2330.TW", start="2023-1-1",end="2023-6-30")
yf.download()
是 yfinance
套件中用於下載金融資料的函式之一。透過此函式,你可以從 Yahoo Finance 下載指定股票的歷史股價資料,並將其存到df中。
以下是 df
的資料格式:
df
是一個 Pandas DataFrame 物件,其中包含了下載的股價資料。DataFrame 是一種表格型資料結構,它以行和列的形式組織資料。在這個特定的情境中,df
包含了以下欄位:
這些欄位以列的形式組織在 DataFrame 中,每一列對應於一個特定的日期。你可以使用 DataFrame 的各種方法和屬性來操作和分析資料,例如選取特定日期範圍的資料、計算統計指標、繪製圖表等。
藉由 yf.download()
函式取得的 DataFrame 可以讓你方便地進行後續的資料分析和視覺化工作,以瞭解該股票在指定日期範圍內的價格變化和交易量情況。
新增plot_k_diagram函式到views.py
def plot_k_diagram(grouped_data):
'''
繪製大盤指數與情緒的疊圖
grouped_data: 分組後的資料,包含 Open、High、Low、Close 等欄位
'''
x_labels = [date.strftime('%m-%d') for date in grouped_data.index]
increasing_color = 'red'
decreasing_color = 'green'
start_date = grouped_data.index.min()
end_date = grouped_data.index.max()
# 移除沒有資料的日期
grouped_data = grouped_data.dropna()
# 建立子圖表,包含兩個軸
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(
go.Candlestick(
x=grouped_data.index,
open=grouped_data['Open'],
high=grouped_data['High'],
low=grouped_data['Low'],
close=grouped_data['Close'],
increasing_line_color=increasing_color,
decreasing_line_color=decreasing_color,
name='Stock'
)
)
# 設置圖表的標題和軸標籤
fig.update_layout(
width=1000,
height=600,
title=dict(
text='台積電2023年股價',
font=dict(color='white')
),
xaxis=dict(
title='時間',
title_font=dict(color='white'),
range=[start_date, end_date], # 設置 x 軸範圍
type='category', # 設定 x 軸類型為 category
tickfont=dict(color='white'),
ticktext=x_labels, # 設定刻度標籤文字
tickvals=list(range(len(x_labels))), # 設定刻度標籤的索引位置
showgrid=False,
),
yaxis=dict(
title='股價',
title_font=dict(color='white'),
showgrid=False,
tickfont=dict(color='white')
),
plot_bgcolor='rgba(0, 0, 0, 0.6)', # 背景設為透明黑
paper_bgcolor='rgba(0, 0, 0, 0.7)' # 背景設為透明
)
return fig
x_labels = [date.strftime('%m-%d') for date in grouped_data.index]
:建立 x 軸的刻度標籤文字,將分組後的資料索引中的日期格式化為 '%m-%d' 形式。
increasing_color = 'red'
和 decreasing_color = 'green'
:設定增長和下降的股價的顏色,因為plotly預設是美股的方式與台股不同。
start_date = grouped_data.index.min()
和 end_date = grouped_data.index.max()
:找到分組後資料索引的最小日期和最大日期。
grouped_data = grouped_data.dropna()
:移除沒有資料的日期。
fig = make_subplots(specs=[[{"secondary_y": True}]])
:建立一個子圖表,其中包含兩個 y 軸,之所以這樣做是方便讀者在後續可以將均線或成交量作疊圖,但這次的鐵人賽我不會教大家怎麼做。
fig.add_trace(go.Candlestick(...))
:新增燭台圖藍圖到子圖表中,使用分組後資料的日期、開盤價、最高價、最低價和收盤價等欄位。
fig.update_layout(...)
:設置圖表的佈局,包括圖表的寬度、高度、標題、軸標籤、背景色等,這裡我設定了透明黑的背景以及白色的標題和刻度。
return fig
:返回建立的圖表物件。
總結來說,這個函數使用分組後的資料繪製燭台圖,並將圖表的標題、軸標籤、背景色等進行設定。該圖表顯示了台積電股價在不同日期的開盤價、最高價、最低價和收盤價,並根據股價的漲跌顏色進行區分。
將plotkdiagram()
新增至views.py
@views_bp.route('/plot')
@login_required
def plotkdiagram():
# 建立 Plotly 圖表
df = yf.download("2330.TW", start="2023-1-1",end="2023-6-30")
user_id = current_user.get_id()
fig=plot_k_diagram(df)
# 將圖表轉換為 HTML 字串
plot_html = fig.to_html()
# 傳遞圖表 HTML 到模板中
return render_template('plot.html', plot_html=plot_html,user_id=user_id)
就是透過yf.download()將台積電的股價存到df中,在將其丟到上面的畫圖函式並宣染到plot.html
中。
今天教導大家如何畫製日K當然目前皆是寫死的,如果讀者想要將日期、股票代碼都可以自己選擇,只要透過html form並將input傳遞給flask即可,如果有從頭到尾看完我相信對大家來說絕非難事,歡迎大家先試試看有問題在詢問。
plotly的教學就先告一段落啦,接下來剩餘的天數皆是linebot串接的篇幅了。